//LiteXLoader Dev Helper
/// <reference path="c:\Users\Yoyo\.vscode\extensions\moxicat.lxldevhelper-0.1.4/Library/JS/Api.js" /> 

/**
 * 自动更新库
 * 作者:Yoyo
 * 主要用于控制插件更新
 * 请勿乱用于其它
 */
 class update {
    static pluginConfig = {
        Yoyo:{
            configUrl:"https://gitee.com/Y_oyo/yoyo-mcbe-lite-xloader-item/raw/master/versioning.json",//配置的地址 请返回 json
            warehouseUrl: "https://gitee.com/Y_oyo/yoyo-mcbe-lite-xloader-item/raw/master/LXLJS/",
            PluginsName:"",//当前插件名 (包含后缀.js) 动态的传入的
            PluginsTitle: "(Yoyo)自动更新库",//当前插件标题
            PluginsV :'',//当前插件版本 0.01 可以判断大小的 但是得字符串哦
            isStatus:false,//当前准备状态
            config:null//当前配置
        }
    };//插件配置


    /**
     * 设置当前插件自动更新
     * @param {object} object 
     */
    static setAutoUpdate(object) {
          //设置log标题
          logger.setTitle("(Yoyo)自动更新库");//设置默认日志标题
        if(typeof object != "object"){
            logger.error(update.pluginConfig[object['name']]['PluginsTitle']+">object not defined");
            return false;
        }
        if (!object['name']) {
            logger.error(update.pluginConfig[object['name']]['PluginsTitle']+">name not defined");
            return false;
        }
        //根据名称去设置配置
        update.pluginConfig[object['name']] = {};
        update.pluginConfig[object['name']]['PluginsName'] = object['name'];//设置名称
        update.pluginConfig[object['name']]['PluginsTitle'] = object['title'] || object['name'].replace(/(\.lxl)?\.js$/, '');//如果标题没有 就从名称中获取
       
        if (!object['url']) {
            logger.error(update.pluginConfig[object['name']]['PluginsTitle']+">url not defined");
            return false;
        }
        update.pluginConfig[object['name']]['warehouseUrl'] = object['url'];
        if (!object['configUrl']) {
            logger.error(update.pluginConfig[object['name']]['PluginsTitle']+">configUrl not defined");
            return false;
        }
        update.pluginConfig[object['name']]['configUrl'] = object['configUrl'];
        if (!object['v']) {
            logger.error(update.pluginConfig[object['name']]['PluginsTitle']+">v not defined");
            return false;
        }
        update.pluginConfig[object['name']]['PluginsV'] = object['v'];
        //注册命令
        mc.regConsoleCmd(`/${update.pluginConfig[object['name']]['PluginsTitle']} update`,'更新插件',()=>{
            if(!update.pluginConfig[object['name']]['isStatus']){
                logger.error(update.pluginConfig[object['name']]['PluginsTitle']+">The update module is not ready!");
                return false;
            }
            update.UpdatePlugin(object['name']);
        });
        //获取更新配置
        update.importVConfig(object['name']).then(() => {
            update.pluginConfig[object['name']]['isStatus'] = true;//准备就绪
            //调用更新 
            update.autoUpdate(object['name']);

        }).catch((error) => {
            logger.error(update.pluginConfig[object['name']]['PluginsTitle']+">error:"+error);
        });

    }

    /**
    * 检测插件更新 并自动更新
    * @returns 
    */
    static autoUpdate(name) {
        if (update.pluginConfig[name]['isStatus']) {
            let vConfig = update.pluginConfig[name]['config'];
            if (vConfig) {
                let thisPlugin = vConfig.Plugin.filter(v => v.name == update.pluginConfig[name]['PluginsName']);
                if (thisPlugin.length < 1) return false;
                let vlxl = lxl.version().major + "." + lxl.version().minor + "." + lxl.version().revision;
                let vbds = mc.getBDSVersion().replace(/^[vV]*/, '');
                if (!thisPlugin[0].pushBDSV.includes(vbds)) return false;//不是包含的bds版本不管
                if (!thisPlugin[0].lxl.includes(vlxl)) return false;//不是包含的lxl版本不管
                if (Number(thisPlugin[0].version) <= update.pluginConfig[name]['PluginsV']) {
                    logger.warn(`${update.pluginConfig[name]['PluginsTitle']}>当前已经是最新版本了!`);
                    return false;//只有大于当前版本才推送
                }
                if (thisPlugin[0].isForceVLxL) {
                    //同版本强制更新
                    logger.warn(`${update.pluginConfig[name]['PluginsTitle']}>强制自动更新-版本:[${thisPlugin[0].version}],更新内容:${thisPlugin[0].UpdateContent}`);
                    update.UpdatePlugin();
                } else {
                    //不强制更新 只做更新提示
                    logger.warn(`${update.pluginConfig[name]['PluginsTitle']}>最版本已发布:[${thisPlugin[0].version}],更新内容:${thisPlugin[0].UpdateContent} 控制台输入 /${update.pluginConfig[name]['PluginsTitle']} update 即可更新插件!`);
                }
            } else {
                logger.error(update.pluginConfig[name]['PluginsTitle']+">自动更新,配置文件加载失败!");
            }
        } else {
            logger.error(`${update.pluginConfig[name]['PluginsTitle']}>自动更新,配置库加载失败!`);
        }
    }

    /**
     * 更新插件
     */
    static UpdatePlugin(name) {
        network.httpGet(`${update.pluginConfig[name]['warehouseUrl']}/${update.pluginConfig[name]['PluginsName']}`, (status, result) => {
            if (status == 200) {
                File.writeTo(`.\\plugins\\${update.pluginConfig[name]['PluginsName']}`, result);
                logger.warn(`${update.pluginConfig[name]['PluginsTitle']}>插件已更新至最新版本! 为防止重载出错! 重启后可生效!`);
            } else {
                logger.error(`${update.pluginConfig[name]['PluginsTitle']}>插件下载失败!请检测url和插件name是否正确!`);
            }
        });
    }

    static importVConfig(name) {
        // 远程更新配置接口
        return new Promise((oks, nos) => {
            network.httpGet(update.pluginConfig[name]['configUrl'], (status, result) => {
                if (status == 200) {
                    if (!update.isJSON(result)) {
                        nos(`${update.pluginConfig[name]['PluginsTitle']}>更新配置不是正确的JSON格式!`);
                        return false;
                    }
                    update.pluginConfig[name]['config'] = JSON.parse(result);
                    oks();
                } else {
                    nos(`${update.pluginConfig[name]['PluginsTitle']}>更新配置获取失败!,请检测configurl!`);
                }
            });
        });

    }

    static isJSON(str) {
        if (typeof str == 'string') {
            try {
                var obj = JSON.parse(str);
                if (typeof obj == 'object' && obj) {
                    return true;
                } else {
                    return false;
                }

            } catch (e) {
                return false;
            }
        }
    }
}

lxl.export(update.setAutoUpdate,"setAutoUpdate");